 1.Apache Kylin 实战之使用Kylin构建Cube
   
   1).准备数据
   1 、准备脚本
   将4个数据文件：dw_sales_data.txt、dim_channel_data.txt、
dim_product_data.txt、dim_region_data.txt
   1个SQL脚本：kylin_examples.sql
放置在 /root/kylin 目录下。
kylin_examples.sql 脚本内容：
-- 创建订单数据库、表结构
create database if not exists `lagou_kylin`;

-- 1、销售表：dw_sales
-- id		唯一标识
-- date1	日期
-- channelId	渠道ID
-- productId	产品ID
-- regionId		区域ID
-- amount		数量
-- price		金额
create table lagou_kylin.dw_sales(
  id string,
  date1 string,
  channelId string,
  productId string,
  regionId string,
  amount int,
  price double
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

-- 2、渠道表：dim_channel
-- channelId 	渠道ID
-- channelName	渠道名称
create table lagou_kylin.dim_channel(
  channelId string,
  channelName string 
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

-- 3、产品表：dim_product
create table lagou_kylin.dim_product(
  productId string,
  productName string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

--4、区域表：dim_region
create table lagou_kylin.dim_region(
  regionId string,
  regionName string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

-- 导入数据
LOAD DATA LOCAL INPATH '/root/kylin/dw_sales_data.txt' OVERWRITE INTO TABLE lagou_kylin.dw_sales;
LOAD DATA LOCAL INPATH '/root/kylin/dim_channel_data.txt' OVERWRITE INTO TABLE lagou_kylin.dim_channel;
LOAD DATA LOCAL INPATH '/root/kylin/dim_product_data.txt' OVERWRITE INTO TABLE lagou_kylin.dim_product;
LOAD DATA LOCAL INPATH '/root/kylin/dim_region_data.txt' OVERWRITE INTO TABLE lagou_kylin.dim_region;

   2 、执行命令 hive -f kylin_examples.sql
   3 、检查建表、数据导入操作是否成功
   4 、按照日期统计订单量、订单总金额
use lagou_kylin;
select date1, sum(price) as total_money, sum(amount) as
total_amount
from dw_sales
group by date1;

   (1).维度表的优化
   要具有数据一致性，主键值必须是唯一的（否则 Kylin 构建过程会报错）
   维度表越小越好，因为 Kylin 会将维度表加载到内存中供查询，过大的表不适合作为维度表，
默认的阈值是 300MB
   改变频率低，Kylin 会在每次构建中试图重用维度表的快照（Snapshot），如果维度表经常
改变的话，重用就会失效，这就会导致要经常对维度表创建快照
   维度表最好不要是 Hive 视图（View），因为每次都需要将视图进行物化，从而导致额外的
时间开销
   (2).事实表的优化
   移除不参与 Cube 构建的字段，可以提升构建速度，降低 Cube 构建结果的大小
   尽可能将事实表进行维度拆分，提取公用的维度
   保证维度表与事实表的映射关系，过滤无法映射的记录
   2).创建 Cube（按日期）
   核心步骤： DataSource => Model => Cube
   Model：描述了一个星型模式的数据结构，定义事实表（Fact Table）和维表(Lookup Table),
以及它们之间的关系。
   基于一个model可创建多个Cube，可减少重复定义工作。
   Cube设计：
   维度：日期
   度量：订单商品销售量、销售总金额
   
   SQL：
   select date1, sum(price), sum(amount)
from dw_sales
group by date1;
   执行步骤：
   1 、创建项目（Project）【非必须】
   2 、创建数据源（DataSource）。指定有哪些数据需要进行数据分析
   3 、创建模型（Model）。指定具体要对哪个事实表、那些维度进行数据分析
   4 、创建立方体（Cube）。指定对哪个数据模型执行数据预处理，生成不同维度的数据
   5 、执行构建、等待构建完成
   6 、再执行SQL查询，获取结果。从Cube中查询数据
   
   操作步骤
   1 、创建项目(Project)
   创建项目（Project）
   输入项目名称
   2 、创建数据源(DataSource)
   3 、创建模型(Model)
   选择new model
   (1).选择New Model
   (2).指定模型名称
   (3).选择事实表
   (4).选择维度
   (5).指定度量
   (6).指定分区和过滤条件
   选择New Model点击save按钮
   4 、创建立方体(Cube)
   (1).新建Cube
   (2).选择数据模型&给定Cube名称
   (3).指定维度
   (4).指定度量
       1 、新建Cube
   (5).指定刷新设置
   (6).高级设置
   5 、执行构建（Build）
   6 、执行SQL语句分析
   执行sql
   在Insight选项卡中，执行以下SQL语句：
select date1,
 	sum(price) as total_money,
 	sum(amount) as total_amount
from dw_sales
group by date1;
   3).创建Cube(按渠道)
   Cube设计：
   维度：渠道
   指标：销售总金额、订单总笔数、最大订单金额、订单的平均金额
   SQL：
select t2.channelid, t2.channelname,
	sum(t1.price), max(t1.price), count(t1.price),
	avg(t1.price)
from dw_sales t1 join dim_channel t2 on 
t1.channelid =t2.channelid
group by t2.channelid, t2.channelname;   
   
   核心步骤：
   指定数据源【可省略】 => 定义model => 定义Cube => Cube Build => SQL
   1 、创建Model
   指定关联表、关联条件
   2 、创建Cube
   定义维度
   定义度量
   3 、执行构建、等待构建完成
   4 、执行SQL查询，获取结果
   执行SQL查询，获取结果
select t2.channelid,
	t2.channelname,
	avg(t1.price)
from dw_sales t1 join dim_channel t2 on 
t1.channelid =t2.channelid
group by t2.channelid, t2.channelname;   
   4).创建Cube（按日期、区域、产品、渠道）
   Cube设计：
   维度：日期、渠道、区域、产品
   指标：销售总金额、订单总笔数
   SQL：
select
	t1.date1,
	t2.regionid,
	t2.regionname,
	t3.productid,
	t3.productname,
	sum(t1.price) as total_money,
	sum(t1.amount) as total_amount
from
	dw_sales t1
inner join dim_region t2
on t1.regionid = t2.regionid
inner join dim_product t3
on t1.productid = t3.productid
group by
	t1.date1,
	t2.regionid,
	t2.regionname,
	t3.productid,
	t3.productname
order by
	t1.date1,
	t2.regionname,
	t3.productname
	
   步骤：定义数据源 => 定义Model => 定义Cube => 构建Cube
   1 、创建Model
   指定关联表、关联条件
   指定维度字段
   指定度量字段
   2 、创建Cube
   指定维度
   指定指标
   3 、执行构建、等待构建完成
   4 、执行SQL查询，获取结果
select
	t1.date1,
	t2.regionid,
	t2.regionname,
	t3.productid,
	t3.productname,
	sum(t1.price) as total_money,
	sum(t1.amount) as total_amount
from
	dw_sales t1
inner join dim_region t2
on t1.regionid = t2.regionid
inner join dim_product t3
on t1.productid = t3.productid
group by
	t1.date1,
	t2.regionid,
	t2.regionname,
	t3.productid,
	t3.productname
order by
	t1.date1,
	t2.regionname,
	t3.productname